# -*- coding: utf-8 -*-
# ****************************************************
# Author: yizuoliang
# Create: 2024/6/24
# Last Modified: 2024/6/24
# Last Editor:
# Description: 初始化logger
# ***************************************************
import logging
import os
from datetime import datetime
from logging.handlers import TimedRotatingFileHandler

from flask import Flask, app


# 文件日志格式
def init_logger(app: Flask):
    LOGS_DIR = os.path.join(app.root_path, '../logs')
    # 创建logs目录
    if not os.path.exists(LOGS_DIR):
        os.makedirs(LOGS_DIR)

    # 日志记录器
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    # 添加文件日志处理器
    logger.addHandler(getInfoLogHander(LOGS_DIR))
    logger.addHandler(getErrorLogHander(LOGS_DIR))
    # 添加控制台日志处理器
    logger.addHandler(getLogHandlerConsole())
    # 配置 Flask 使用自定义的日志记录器
    app.logger = logger


def getInfoLogHander(LOGS_DIR):
    # 文件名，以日期作为文件名
    log_file_info_name = datetime.today().strftime('%Y-%m-%d-info.log')
    # 构建日志文件的路径
    log_file_info_str = os.path.join(LOGS_DIR, log_file_info_name)
    '1、日志记录的格式'
    # 设置日志的格式:发生时间,日志等级,日志信息文件名,函数名,行数,日志信息
    formatter = logging.Formatter(
        '[%(levelname)s] [%(asctime)s] [process=%(process)s thread=%(thread)s] - %(filename)s [line:%(lineno)d]: %(message)s')

    '2、基于时间的日志处理器'
    '''
    # 往文件里写入指定间隔时间自动生成文件的Handler
    # 实例化TimedRotatingFileHandler
    # interval是时间间隔，backupCount是备份文件的个数，如果超过这个个数，就会自动删除，when是间隔的时间单位，单位有以下几种：
    # S 秒
    # M 分
    # H 小时
    # D 天
    # 'W0'-'W6' 每星期（interval=0时代表星期一：W0）
    # midnight 每天凌晨
    '''
    file_log_info_handler = TimedRotatingFileHandler(
        filename=log_file_info_str,  # 日志文件的路径
        when='midnight',  # 凌晨零点进行文件分割
        backupCount=0,  # 保留旧文件数0
        interval=1,  # 分割一次
        encoding='utf-8')  # 日志处理器
    file_log_info_handler.setFormatter(formatter)  # 日志格式
    file_log_info_handler.setLevel(logging.INFO)  # 日志等级
    return file_log_info_handler  # 基于文件大小分割日志的方案


def getErrorLogHander(LOGS_DIR):
    # 文件名，以日期作为文件名
    log_file_error_name = datetime.today().strftime('%Y-%m-%d-error.log')
    # 构建日志文件的路径
    log_file_error_str = os.path.join(LOGS_DIR, log_file_error_name)
    '1、日志记录的格式'
    # 设置日志的格式:发生时间,日志等级,日志信息文件名,函数名,行数,日志信息
    formatter = logging.Formatter(
        '[%(levelname)s] [%(asctime)s] [process=%(process)s thread=%(thread)s] - %(filename)s [line:%(lineno)d]: %(message)s')

    '2、基于时间的日志处理器'
    '''
    # 往文件里写入指定间隔时间自动生成文件的Handler
    # 实例化TimedRotatingFileHandler
    # interval是时间间隔，backupCount是备份文件的个数，如果超过这个个数，就会自动删除，when是间隔的时间单位，单位有以下几种：
    # S 秒
    # M 分
    # H 小时
    # D 天
    # 'W0'-'W6' 每星期（interval=0时代表星期一：W0）
    # midnight 每天凌晨
    '''
    file_log_error_handler = TimedRotatingFileHandler(
        filename=log_file_error_str,  # 日志文件的路径
        when='midnight',  # 凌晨零点进行文件分割
        backupCount=0,  # 保留旧文件数0
        interval=1,  # 分割一次
        encoding='utf-8')  # 日志处理器
    file_log_error_handler.setFormatter(formatter)  # 日志格式
    file_log_error_handler.setLevel(logging.ERROR)  # 日志等级
    return file_log_error_handler  # 基于文件大小分割日志的方案


# 控制台日志格式
def getLogHandlerConsole():
    formatter = logging.Formatter(
        '[%(levelname)s] [%(asctime)s] [process=%(process)s thread=%(thread)s] - %(filename)s [line:%(lineno)d]: %(message)s')
    '2、输出到控制台处理器'
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(formatter)
    return console_handler
